package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
    // 图片保存的基本目录
    @Value("${reggie.path}")
    private String baseImagePath;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file)  {
        log.info("[文件上传,文件原名:{}]",file.getOriginalFilename());
        log.info("[文件上传,文件保存路径:{}]",baseImagePath);
        // 1.一般是对上传的文件，进行重新命名,一般采用UUID进行取名，一般不重名，文件的后缀名使用原来的。
        // a1.png a2.jpg,截取字符串，是从.的位置开始去，需要找到.的位置,从文件末尾倒着找，找到第1个.
        int dotLastIndexOf = file.getOriginalFilename().lastIndexOf(".");
        String suffix = file.getOriginalFilename().substring(dotLastIndexOf);
        // 2.把上传的文件保存到文件上传的路径中
        //  UUID.randomUUID()就是产生一个很长的随机字符串，保证名称不重复
        String fileName = UUID.randomUUID().toString()+suffix; // 可以先用上传的文件名，保存
        log.info("fileName:{}"+fileName);
        File savePathFile = new File(baseImagePath);
        // 判断一下文件保存的基本路径是否存在，如果不存在了，我们就构建一下
        if(!savePathFile.exists()){
            savePathFile.mkdirs();
        }
        try {

            // 第1参数，文件的保存基本路径
            // 第2参数，文件的名字
            // 上传上来的文件在file对象中，通过transferTo把从内存存储到磁盘上去
            file.transferTo(new File(savePathFile,fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 3.把上传完的文件名下发给客户端
        return R.success(fileName);
    }

    // http://localhost:8080/common/download?name=4425b30b-53c9-45c8-a733-9e2a02bc1ae4.jpeg
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){

        // 找到了，文件保存的路径
        File savePathFile = new File(baseImagePath);
        try {
            // 1.根据前端提供的文件名，去文件保存的路径，去构建一个文件输入流
            // 把文件到到了内存中
            //  new File("完成路径"),new File("路径","文件名")
            FileInputStream fileInputStream = new FileInputStream(new File(savePathFile,name));
            // 2.使用response的输出流，outputStream写回到客户端的浏览器
            ServletOutputStream outputStream = response.getOutputStream();
            // 设置输出的类型,image/jgeg,这个必须这样写
            response.setContentType("image/jpeg");
            // 3.使用工具类，完成文件输出
            IOUtils.copy(fileInputStream,outputStream);
            // 关闭我们的文件流，千万不能关闭outputStream
            fileInputStream.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
